package org.java.documents.jdk.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.LinkedList;
import java.util.List;

@Entity
@Getter
@Setter
@ToString
//文档成员
public class DocumentMember {
    @Id
    // 使用Hibernate的UUID2算法生成主键的值，适合在分布式环境中使用
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    // 使用前面定义的UUID2算法
    @GeneratedValue(generator = "uuid2")
    @Column(length = 36)
    private String id;
    // 名称
    private String name;
    //签名、定义、声明
    private String signature;
    // 概述
    private String summary;
    // 详述
    private String description;
    // 原始URL
    private String url;

    //    属于哪个文档
    @ManyToOne()
    private Document document;

//     成员的数据类型： 方法、字段/成员变量、构造器、章节
// EnumType.ORDINAL  : 在数据库里面存储枚举的索引值
// EnumType.STRING   : 表示在数据库里面存储枚举常量的名称
    @Enumerated(EnumType.STRING)
    private MemberType memberType;
    //    成员的数据类型，可能为null，如果不为空则应该引用另一个DocumentMember
//    基本类型是int、float.这种可以设计几个固定的成员类型
//    如果是方法，通常就是返回值类型，如果是成员变量则是变量的数据类型
    @ManyToOne
    @JoinColumn(name = "DATA_TYPE_ID")
    private DocumentMember dataType;
    //  实例代码
    private String sample;
//    文档里面的下级内容
//    数据库里面，如果MEMBER_ID不为空，表示文档成员是下级文档
    @OneToMany()
    @JoinColumn(name = "MEMBER_ID")
    private List<DocumentMember> members = new LinkedList<>();
    // 引用哪些文档
    @OneToMany()
    private List<DocumentReference> documentReferences = new LinkedList<>();
    // 使用此成员可能出现的异常
    @OneToMany()
    private List<MemberException> memberExceptions = new LinkedList<>();
    // 使用此成员时需要传入的参数说明
    @OneToMany()
    private List<MemberParameter> memberParameters = new LinkedList<>();
}
